# HUB 插件 - 进度条显示模块
# 实现从jd.JSON读取进度并在左上角显示

require 'sketchup.rb'

module HUB
  module JDT
    # 使用file_loaded?机制防止重复加载
    unless file_loaded?(__FILE__)
      @progress_timer = nil
      @operation_type = nil # 'upload' 或 'download'
      @last_check_time = nil # 上次检查jd.JSON文件的时间
      @check_interval = 0.2 # 检查间隔，200毫秒
      @last_content = nil # 上次读取的内容
      @progress_tool = nil # 进度显示工具
      @previous_tool = nil # 之前的工具
      @current_progress = "0%" # 当前进度
      @current_info = nil # 当前额外信息
      @window_id = nil # 当前窗口ID，用于多窗口兼容
      
      # 标记此文件已加载
      file_loaded(__FILE__)
    end
    
    # 进度显示工具类 - 实现Tool接口以支持绘制
    class ProgressOverlayTool
      def initialize
        @progress = nil
        @info = nil
        @operation_type = nil
        @show_progress = false
      end
      
      # 更新进度信息
      def update_progress(progress, info, operation_type)
        @progress = progress
        @info = info
        @operation_type = operation_type
        @show_progress = true
        # 刷新视图
        Sketchup.active_model.active_view.invalidate if Sketchup.active_model && Sketchup.active_model.active_view
      end
      
      # 清空进度
      def clear_progress
        @progress = nil
        @info = nil
        @operation_type = nil
        @show_progress = false
        # 刷新视图
        Sketchup.active_model.active_view.invalidate if Sketchup.active_model && Sketchup.active_model.active_view
      end
      
      # Tool接口方法
      def activate
        # 工具激活时的操作
      end
      
      def deactivate(view)
        # 工具停用时的操作
      end
      
      def onMouseMove(flags, x, y, view)
        # 鼠标移动事件（不处理，保持透明）
      end
      
      def onLButtonDown(flags, x, y, view)
        # 鼠标左键按下事件（不处理，保持透明）
        false # 返回false让事件继续传递
      end
      
      def onRButtonDown(flags, x, y, view)
        # 鼠标右键按下事件（不处理，保持透明）
        false # 返回false让事件继续传递
      end
      
      # 绘制进度信息
      def draw(view)
        return unless @show_progress && @progress && @operation_type
        
        # 设置显示位置 - 左上角
        left_margin = 10
        top_margin = 10
        
        # 准备显示文本
        title_text = case @operation_type
        when 'upload'
          "上传进度"
        when 'download'
          "下载进度"
        else
          "进度"
        end
        
        progress_text = @progress
        info_text = @info ? " (#{@info})" : ""
        
        # 计算背景尺寸
        bg_width = 280
        bg_height = @info ? 70 : 50
        
        # 绘制背景矩形
        bg_points = [
          [left_margin, top_margin],
          [left_margin + bg_width, top_margin],
          [left_margin + bg_width, top_margin + bg_height],
          [left_margin, top_margin + bg_height]
        ]
        
        # 绘制半透明背景
        view.drawing_color = Sketchup::Color.new(240, 240, 240, 200)
        view.draw2d(GL_QUADS, bg_points)
        
        # 绘制边框
        view.drawing_color = Sketchup::Color.new(80, 80, 80)
        view.line_width = 1
        view.draw2d(GL_LINE_LOOP, bg_points)
        
        # 绘制标题
        view.drawing_color = Sketchup::Color.new(0, 60, 120)
        view.draw_text([left_margin + 10, top_margin + 18], title_text)
        
        # 绘制进度
        view.drawing_color = Sketchup::Color.new(60, 60, 60)
        view.draw_text([left_margin + 10, top_margin + 35], progress_text + info_text)
        
        # 如果有额外信息，在第三行显示
        if @info && @info.length > 10
          view.draw_text([left_margin + 10, top_margin + 52], @info)
        end
        
        # 恢复默认线宽
        view.line_width = 1
      end
    end
    

    
    # 获取当前窗口的唯一ID
    def self.get_window_id
      return @window_id if @window_id
      
      # 使用进程ID和模型对象ID组合生成唯一标识
      begin
        process_id = Process.pid
        model_id = Sketchup.active_model ? Sketchup.active_model.object_id : 0
        @window_id = "#{process_id}_#{model_id}"
        puts "JDT: 生成窗口ID: #{@window_id}"
      rescue => e
        # 如果获取失败，使用时间戳作为备选
        @window_id = "fallback_#{Time.now.to_i}_#{rand(1000)}"
        puts "JDT: 使用备选窗口ID: #{@window_id}"
      end
      
      @window_id
    end
    
    # 获取当前窗口专用的JSON文件路径
    def self.progress_file_path
      plugin_dir = File.dirname(File.dirname(__FILE__))
      window_id = get_window_id
      File.join(plugin_dir, 'HUB', "jd_#{window_id}.JSON")
    end
    
    # 启动进度监控
    def self.start_progress_monitor
      begin
        # 如果计时器已经在运行，先停止它
        stop_progress_monitor if @progress_timer
        
        # 确保窗口ID已生成
        window_id = get_window_id
        
        # 启动前先清理所有旧的进度文件
        cleanup_old_progress_files
        
        # 创建进度显示工具
        @progress_tool = ProgressOverlayTool.new
        
        # 创建计时器，每200ms检查一次当前窗口的JSON文件
        @progress_timer = UI.start_timer(0.2, true) { check_progress_file }
        
        # 直接使用puts输出日志，确保即使HUB.log未准备好也能看到日志
        puts "JDT: 已启动进度监控 (窗口ID: #{window_id})"
        
        # 尝试使用HUB.log记录日志
        if HUB.respond_to?(:log)
          HUB.log("JDT: 已启动进度监控 (窗口ID: #{window_id})", 2)
        end
      rescue => e
        # 直接使用puts输出错误，确保能看到错误信息
        puts "JDT: 启动进度监控时出错: #{e.message}"
        puts e.backtrace.join("\n")
      end
    end
    
    # 停止进度监控
    def self.stop_progress_monitor
      if @progress_timer
        UI.stop_timer(@progress_timer)
        @progress_timer = nil
        @operation_type = nil
        
        # 清空进度显示
        if @progress_tool
          @progress_tool.clear_progress
          @progress_tool = nil
        end
        
        # 清理当前窗口的进度文件
        begin
          file_path = progress_file_path
          if File.exist?(file_path)
            File.delete(file_path)
            puts "JDT: 已清理进度文件: #{File.basename(file_path)}"
          end
        rescue => e
          puts "JDT: 清理进度文件时出错: #{e.message}"
        end
        
        # 直接使用puts输出日志
        puts "JDT: 已停止进度监控 (窗口ID: #{@window_id})"
        
        # 尝试使用HUB.log记录日志
        if HUB.respond_to?(:log)
          HUB.log("JDT: 已停止进度监控 (窗口ID: #{@window_id})", 2)
        end
      end
    end
    
    # 检查进度文件
    def self.check_progress_file
      begin
        # 检查文件是否存在
        file_path = progress_file_path
        unless File.exist?(file_path)
          # 如果文件不存在但之前有操作类型，清空状态栏
          if @operation_type
            @operation_type = nil
            Sketchup.status_text = ""
          end
          return
        end
        
        # 读取文件内容
        content = File.read(file_path).strip
        
        # 如果内容没有变化，不做处理
        if content == @last_content
          return
        end
        
        # 更新最后读取的内容
        @last_content = content
        
        # 直接使用puts输出日志，显示读取到的内容
        puts "JDT: 读取到进度信息: #{content}"
        
        # 解析进度信息 - 解析[jdt]="20%"格式
        progress_match = content.match(/\[jdt\]="([^"]*)"/)
        progress = progress_match ? progress_match[1] : "0%"
        
        # 解析额外信息 - 解析[info]="10MB"格式
        info_match = content.match(/\[info\]="([^"]*)"/)
        info = info_match ? info_match[1] : nil
        
        # 解析操作类型 - 解析[type]="upload"格式
        type_match = content.match(/\[type\]="([^"]*)"/)
        type = type_match ? type_match[1] : nil
        
        # 判断操作类型
        if type == "upload"
          @operation_type = 'upload'
        elsif type == "download"
          @operation_type = 'download'
        # 如果没有明确的操作类型标记，根据内容判断
        elsif content.include?("upload")
          @operation_type = 'upload'
        elsif content.include?("download")
          @operation_type = 'download'
        # 如果还是没有，根据info判断
        elsif !@operation_type
          if info && info.include?("MB")
            @operation_type = 'download' # 假设有MB信息的是下载
          else
            @operation_type = 'upload' # 默认为上传
          end
        end
        
        # 显示进度
        display_progress(progress, info)
        
        # 如果进度是100%，5秒后自动清空显示
        if progress == "100%"
          UI.start_timer(5, false) {
            clear_progress_display
          }
        end
        
      rescue => e
        # 尝试使用HUB.log如果可用
        if defined?(HUB) && HUB.respond_to?(:log)
          HUB.log("JDT: 检查进度文件时出错: #{e.message}", 3)
        else
          puts "JDT Error: #{e.message}"
          puts e.backtrace.join("\n")
        end
      end
    end
    
    # 显示进度（在左上角）
    def self.display_progress(progress, info)
      if @progress_tool
        @progress_tool.update_progress(progress, info, @operation_type)
        # 激活进度显示工具
        activate_progress_tool
        puts "JDT: 显示进度: #{@operation_type} #{progress}#{info ? " (#{info})" : ""}"
      else
        puts "JDT: 进度显示工具未初始化"
      end
    end
    
    # 激活进度显示工具
    def self.activate_progress_tool
      if @progress_tool && Sketchup.active_model
        # 保存当前工具
        @previous_tool = Sketchup.active_model.tools.active_tool_id if Sketchup.active_model.tools.respond_to?(:active_tool_id)
        # 激活进度显示工具
        Sketchup.active_model.select_tool(@progress_tool)
      end
    end
    
    # 恢复之前的工具
    def self.restore_previous_tool
      if Sketchup.active_model
        # 切换回选择工具
        Sketchup.active_model.select_tool(nil)
      end
    end
    
    # 清空进度显示
    def self.clear_progress_display
      if @progress_tool
        @progress_tool.clear_progress
        # 恢复之前的工具
        restore_previous_tool
        puts "JDT: 清空进度显示"
      end
    end
    
    # 清理所有旧的进度文件
    def self.cleanup_old_progress_files
      begin
        plugin_dir = File.dirname(File.dirname(__FILE__))
        hub_dir = File.join(plugin_dir, 'HUB')
        
        # 查找所有jd开头的JSON文件
        Dir.glob(File.join(hub_dir, 'jd*.JSON')).each do |file_path|
          File.delete(file_path)
          puts "JDT: 清理旧进度文件: #{File.basename(file_path)}"
        end
      rescue => e
        puts "JDT: 清理旧进度文件时出错: #{e.message}"
      end
    end
    
    # 记录日志
    def self.log(message, level = 2) # 默认使用INFO级别
      # 直接使用puts输出日志
      puts message
      
      # 尝试使用HUB.log记录日志
      if HUB.respond_to?(:log)
        HUB.log(message, level)
      end
    end
    
    # 进度监控现在由上传和下载功能按需启动，不再自动启动
    
  end # module JDT
end # module HUB
